import axios from "axios";

// 创建了一个使用 Axios 库的 http 实例，并设置了请求超时时间为 1000 毫秒（1秒）
const http = axios.create({
  timeout: 1000,
});
// 请求拦截器
//注册了一个请求拦截器，它将在每次发送请求前被调用
http.interceptors.request.use((config) => {
  if (localStorage.getItem("token")) {
    config.headers.Authorization = "Bearer " + localStorage.getItem("token");
  }
  //  通过 if (!config.retryCount) 条件判断，检查配置对象 config 中是否存在 retryCount 字段
  if (!config.retryCount) {
    // 如果 retryCount 不存在，即为初次请求，则将 retryCount 初始化为 1
    config.retryCount = 1;
  } else {
    // 如果 retryCount 已经存在，即为重试请求，则将 retryCount 加 1
    config.retryCount += 1;
  }
  return config;
});

// 拦截处理
http.interceptors.response.use(
  (res) => {
    // 响应成功，
    // console.log(res,'成功');
    if (res.data.code === 401) {
      // message.error(res.data.msg)
      window.location.href("/login");
      return;
    }
    return res.data;
  },
  (err) => {
    // 响应失败
    console.log(err, "失败");
    // 判断错误信息中是否包含 'timeout' ，以确定是否发生了超时错误
    if (err.message.includes("timeout")) {
      // 如果发生超时错误且重试次数小于 3，则进行请求重试
      if (err.config.retryCount < 3) {
        // 通过调用 http(err.config) 实现请求的重试，err.config 是之前请求的配置对象
        return http(err.config);
      }
    }
    // 如果不满足重试条件，或者重试次数已达到上限，通过 Promise.reject(err) 返回一个带有错误信息的拒绝状态 Promise，即将错误向下传递。
    return Promise.reject(err);
  }
);

export default http;
